API 서버에 대한 Nginx 프록시 설정시 404 에러 해결 요청

문제 상황

초기 상태

문제의 설정 파일들

/etc/nginx/sites-enabled/default (Ubuntu 기본 설정)

server {
    listen 80 default_server;          # IPv4 기본 80포트 리스닝
    listen [::]:80 default_server;     # IPv6 기본 80포트 리스닝

    root /var/www/html;                # 웹 루트 디렉토리 설정
    index index.html index.htm index.nginx-debian.html;  # 기본 인덱스 파일 설정
    server_name _;                     # 모든 호스트명 매칭

    location / {
        try_files $uri $uri/ =404;     # 파일 찾기 시도 후 404 반환
    }
}

/etc/nginx/conf.d/default.conf (추가하려던 API 프록시 설정)

server {
    listen 80 default_server;          # IPv4 80포트 기본 서버 설정 (충돌 발생)
    listen [::]:80 default_server;     # IPv6 80포트 기본 서버 설정 (충돌 발생)
    server_name localhost;             # localhost 호스트명 매칭

    include /etc/nginx/conf.d/api-service-url.inc;  # API 서버 URL 설정 포함

    location /api/v1/ {                # API 경로 매칭
        proxy_pass $api_service_url;   # 설정된 API 서버로 프록시
        proxy_set_header X-Real-IP $remote_addr;           # 실제 클라이언트 IP 전달
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 프록시 정보 전달
        proxy_set_header Host $http_host;                  # 원본 호스트 헤더 유지
    }
}

원인 분석

기존 설정 파일 구조

# /etc/nginx/conf.d/api-service-url.inc
set $api_service_url http://127.0.0.1:9001;  # API 서버 주소 변수 설정

# /etc/nginx/conf.d/default.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name localhost;

    include /etc/nginx/conf.d/api-service-url.inc;

    location /api/v1/ {
        proxy_pass $api_service_url;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    # 기본 설정
    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # SSL 설정
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    # 로깅 설정
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Gzip 압축
    gzip on;

    # 설정 파일 Include
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;  # 이 부분이 충돌의 원인
}

해결 방법

방법 1: nginx.conf에서 sites-enabled 설정 제외

http {
    include /etc/nginx/conf.d/*.conf;                # conf.d 디렉토리 설정 포함
    # include /etc/nginx/sites-enabled/*;            # 기본 설정 비활성화
}

방법 2: sites-enabled의 default 설정 제거

rm /etc/nginx/sites-enabled/default*

설정 테스트

rm /etc/nginx/sites-enabled/default*              # 기본 설정 파일 제거

sudo nginx -t                                     # 설정 문법 검사
sudo nginx -s reload                             # 설정 리로드

# 테스트 명령어
curl -v http://localhost:9001/api/v1/health/active-profile    # API 서버 직접 접근 테스트
curl -v http://localhost/api/v1/health/active-profile         # Nginx 프록시 경유 테스트

Apache vs Nginx 설정 방식 비교

Apache

Nginx